home *** CD-ROM | disk | FTP | other *** search
/ NetNews Offline 2 / NetNews Offline Volume 2.iso / news / comp / lang / c-part1 / 4205 < prev    next >
Encoding:
Text File  |  1996-08-05  |  3.7 KB  |  87 lines

  1. Newsgroups: comp.lang.c
  2. Path: news.sprintlink.net!eskimo!scs
  3. From: scs@eskimo.com (Steve Summit)
  4. Subject: Re: realloc question
  5. X-Nntp-Posting-Host: eskimo.com
  6. Message-ID: <DM5tEn.BFo@eskimo.com>
  7. Sender: news@eskimo.com (News User Id)
  8. Organization: schmorganization
  9. References: <4ehi4b$qfo@news.texas.net>
  10. Date: Fri, 2 Feb 1996 17:47:10 GMT
  11.  
  12. In article <4ehi4b$qfo@news.texas.net>, gcherer@millenium.texas.net writes:
  13. > Whether i am on my old 286 with 1 meg, or on my 486 with 8 meg of ram, i 
  14. > get the same result when i do a realloc on about the 50th iteration.( its
  15. > on an array of pointers). but, when i compile and run the same program on 
  16. > a unix box (with beacoups more memory) it runs with no probs.
  17. >...
  18. > x++;
  19. > ptr=(struct sumthin**) realloc(ptr,(x+1) * sizeof(struct sumthin));
  20. > ptr[x]=(struct sumthin*) calloc(1,sizeof(struct sumthin));
  21. > Any ideas?? Sure preeeeeciate 'em. TIA
  22.  
  23. There are three possible problems that I can see:
  24.  
  25.      1.    You're simply running out of memory.  (You already
  26.     thought of that one.)
  27.  
  28.      2. The typo you made in the code fragment above also appears
  29.     in the code you're running, and you're allocating much
  30.     more memory than you need for the struct sumthin pointers,
  31.     and wasting (not using) most of it.  The second line
  32.     should read
  33.  
  34.         ptr = (struct sumthin **)realloc(ptr,
  35.             (x+1) * sizeof(struct sumthin *));
  36.  
  37.     (This is easy to spot, if you remember the rule that
  38.     there should always be one more * in the cast than in the
  39.     sizeof.  On the other hand, the explicit cast isn't
  40.     really recommended any more.)
  41.  
  42.      3.    You're fragmenting memory, so that although there's an
  43.     amount of total free memory available which is greater
  44.     than or equal to your request, it's not contiguous and
  45.     no one piece is big enough to satisfy your request.
  46.  
  47.     This is most likely your problem, because the calling
  48.     pattern you've shown turns out to fragment memory in the
  49.     worst possible way, if malloc and realloc are using the
  50.     obvious "first fit" allocation.  I've sent you a longer
  51.     description in e-mail (which anyone else is welcome to on
  52.     request), but basically what happens is that the array of
  53.     struct sumthin pointers leapfrogs through memory, leaving
  54.     a trail of successively larger holes behind it, each
  55.     guarded on either side by a block of struct sumthin which
  56.     you don't free or reallocate, and each too small for the
  57.     larger and larger arrays of struct sumthin pointers you
  58.     keep wanting.
  59.  
  60. There are several ways to work around this last problem.  You can
  61. use a version of malloc that doesn't use such a simpleminded
  62. first-fit strategy, and which therefore doesn't fragment memory
  63. so badly in the face of this calling pattern.  (It's likely that
  64. the Unix machine you tried the program on, besides having more
  65. memory, also used a different malloc algorithm, since the simple
  66. first-fit algorithms perform very badly in a virtual memory
  67. environment anyway.)  You can dig into your existing malloc and
  68. tweak its search behavior on the fly (I've occasionally done
  69. this), but of course this is completely nonportable and ties you
  70. to a particular malloc implementation and isn't generally
  71. recommended.
  72.  
  73. Finally, you can change your memory allocation pattern.  One easy
  74. fix (which I've used to success when I've had exactly this
  75. problem, on my poor old PDP-11 with 64K) is to grow your array of
  76. struct sumthin pointers in chunks of 10 or 50 at a time, instead
  77. of 1 at a time.  (In this case, you have to keep track of two
  78. counts, one of how many pointers you've allocated and one of how
  79. many of them you're using).  You may still fragment memory in
  80. this case, but not nearly so quickly or so badly.  Yet another
  81. solution would be to use a linked list, so that you wouldn't need
  82. contiguous arrays of pointers at all.
  83.  
  84.                     Steve Summit
  85.                     scs@eskimo.com
  86.